home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / apic / examples / dimmer.asm < prev    next >
Assembly Source File  |  1998-01-05  |  7KB  |  235 lines

  1.  
  2. ;
  3. ; pic 4 dummies..
  4. ; This is a phase first slicer for the 16C84 - documented in broken inglisch ;-(
  5. ; assemble me with: picasm dimm.asm <CR>
  6. ; $VER: dimmer.asm V1.42 (19.09.97)
  7. ; ©: This program is free software and can be used and distributed
  8. ; ©: under the terms of the GNU General Public License.
  9. ;
  10.  
  11.  
  12.   list  p=PIC16C84, r=dec, s=on
  13. ;                          ^interpret the code as case sensItive
  14. ;                   ^radix is decimal
  15. ;       ^the `84 is the target processor
  16.  
  17.  
  18.  
  19.   device hs_osc,protect_off,wdt_off
  20. ;                           ^the watchdog sleeps ;-)
  21. ;               ^no read protection
  22. ;        ^config the osilator in high-speed mode
  23.  
  24.  
  25.  
  26.   XTAL 4000000 ;crystal freq. for Amiga Picsim [Hz]
  27.  
  28.   include "ram:p16c84.inc" ; load this include-file
  29.  
  30.  
  31. ;some definitions ...
  32.  
  33. #define ELR PORTA,2 ; led-triac modul (via 470R)
  34. #define POWER_LINE PORTA,3     ; 100V - 250V AC (via 2 * 4M7 in series !)
  35.                                ;    W A R N I N G !¡! HIGH VOLTAGE !!!
  36.  
  37.  
  38. #define DARKER  PORTB,4       ; connect this pin to ground to make it darker
  39. #define BRIGHTER  PORTB,5     ; connect this pin to ground to make it brighter
  40.  
  41. ; these are the definitions work in  MY circuit (230V 50Hz)
  42.  
  43. #define IGNITION_DELAY 30     ; the led of the power modul must be on for at least
  44.                               ; some µ seconds
  45. #define IGNITION_PRESET 128     ; about 90° first slice
  46. #define DIMM_MIN 15          ;max.  value off the fileregister dimm
  47.  
  48.  
  49. DIMM_MAX     =  200       ; min.  value off the fileregister dimm
  50. DIMM_X         =  254       ; min.  value off the fileregister dimm
  51.  
  52. XTAL         = 4000000     ;crystal freq. for delay-time calulations [Hz]
  53. LINE_FREQ     = 50         ;power_line freq. [Hz]
  54.  
  55. CLOCKCYCLES_PER_INSTRUCTIONS = 4
  56.  
  57. IPHW         = XTAL/CLOCKCYCLES_PER_INSTRUCTIONS/LINE_FREQ/2
  58.  
  59. ; IPHW     = Instruction Per HalvWave( i.e. 10ms @ 50Hz)
  60.  
  61.  
  62. INSTRUCTIONCYCLES_PER_DELAYCYC = 3
  63.  
  64. ;DIMM_WAIT     = ((IPHW-50)/DIMM_MAX+20)/ INSTRUCTIONCYCLES_PER_DELAYCYC
  65. DIMM_WAIT     = (IPHW-122-DIMM_X*8)/ (INSTRUCTIONCYCLES_PER_DELAYCYC * DIMM_X)
  66.  
  67.  
  68. ; some very simple macros..
  69.  
  70.     macro elr_off
  71.             bcf ELR ; LED of the powermodul off
  72.     endm
  73.  
  74.     macro elr_on
  75.             bsf ELR ; LED of the powermodul on
  76.     endm
  77.  
  78.  
  79. ; some fileregisters are defined here...
  80.   CBLOCK  0xc
  81.   dimm
  82.   dimm_counter
  83.   wait_counter
  84.   ENDC
  85.  
  86.  
  87.  
  88.   org 0x0 ; the program starts at 0x0000
  89.  
  90. init ; do the necessary initializations here ...
  91.  
  92.             clrf PORTA         ; clear both ports
  93.             clrf PORTB
  94.  
  95.             bsf STATUS, RP0       ; switch to bank 1
  96.  
  97.             bcf OPTION_REG, 7         ; PORTB pull-ups are enabled (for the 2 keys)
  98. ;****            bcf OPTION_REG, RBPU     ; PORTB pull-ups are enabled (for the 2 keys)
  99.  
  100.             movlw 0x0
  101.             movwf TRISB
  102.             movwf TRISA
  103.                                   ; TRISA(B) and PORTA(B) are the same ...
  104.             bsf POWER_LINE        ; these pins are inputs (in=1, out=0)
  105.             bsf DARKER
  106.             bsf BRIGHTER
  107.  
  108.             bcf STATUS, RP0       ; switch back to bank 0
  109.  
  110.  
  111.             movlw IGNITION_PRESET
  112.             movwf dimm
  113.  
  114.  
  115. main_loop
  116.             call wait_line_change  ; call a subroutine
  117.             movf dimm,w      ; transfer the the data form the "dimm" file-register
  118.                              ;  into the working register
  119.             call dimm_it
  120.             btfss BRIGHTER     ; test if the BRIGHTER pin is low
  121.               incf dimm     ; ok, it`s low, increment dimm by one
  122.             btfss DARKER       ; test if the DARKER pin is low
  123.               decf dimm     ; ok, it`s low, decrement dimm by one
  124.  
  125.             movlw DIMM_MIN     ; move DIMM_MIN in the working register
  126.             subwf dimm,w      ; subtract w from dimm and store the result in w
  127.             btfsc STATUS, Z     ; is last result Zero ?
  128.               incf dimm       ; yes -> inc. dimm
  129.  
  130.             movlw DIMM_MAX     ; same with the upper limit...
  131.             subwf dimm,w
  132.             btfsc STATUS, Z
  133.               decf dimm     ; ...but here we decrease dimm
  134.  
  135.             goto main_loop     ; jump to main_loop and repeat this stuff forever...
  136.  
  137.  
  138. dimm_it
  139.             movwf dimm_counter   ; copy w in dimm_counter
  140.             comf dimm_counter,f   ; generate the complement of dimm_counter and
  141.                                   ; store it in dimm_counter
  142. dimm_loop
  143.             call wait
  144.             decfsz dimm_counter
  145.               goto dimm_loop
  146.             elr_on         ;  macro:     bsf     PORTA, ELR
  147.             call ignition_wait    ; wait some µ seconds
  148.             elr_off ;  macro:     bcf     PORTA, ELR
  149.             return
  150.  
  151. wait                 ; ... a small delay routine ...
  152.             movlw DIMM_WAIT
  153.             movwf wait_counter
  154. wait_loop
  155.             decfsz wait_counter
  156.               goto wait_loop
  157.             return
  158.  
  159.  
  160. ignition_wait             ; the TRIAC need some time (µs) to ignite
  161.             movlw IGNITION_DELAY
  162.             movwf wait_counter
  163. i_wait_loop
  164.             decfsz wait_counter
  165.               goto i_wait_loop
  166.             return
  167.  
  168.  
  169. wait_line_change         ; wait until the level of the POWER_LINE pin change
  170.             btfss POWER_LINE
  171.               goto line_is_low
  172. line_is_high
  173.             btfsc POWER_LINE
  174.               goto line_is_high
  175.             return         ;return from subroutine
  176. line_is_low
  177.             btfss POWER_LINE
  178.               goto line_is_low
  179.             return
  180.  
  181.  
  182.  
  183. ;CAUTION: To prevent a electric shock this circuit should be build and operated
  184. ;         by qualified persons ONLY !
  185. ;
  186. ;
  187. ; and now some ASCII-art... (try another font if you see no art :-)
  188. ;
  189. ;
  190. ;                      R1     R2      *               +5V  R4  [4]
  191. ;     -------------x--vvvv---vvvv----|                  |-vvvv-|
  192. ;     |            |                --------------------------------
  193. ;   L o           ---------   R3   |[2]                Vdd[14]  [11]|--------
  194. ; 100-250 VAC    |powermod.|-vvvv--|[1]                             |       |
  195. ;   N O           ---------        |           PIC16C84             |       |
  196. ;     |    \ /     |     |         |                   GND[5]   [10]|-|     |
  197. ;     x-----X------|     |          --------------------------------   /     /
  198. ;     |    / \           |                               |            /     /
  199. ;     -------------------x-------------------------------x------------x-----x
  200. ;
  201. ; *:the µC has internal diodes from most pins to the powerrails
  202. ;    i.e. the voltage is not beyond the absolute maximum ratings if the current
  203. ;    is limited by a resistor.
  204. ;
  205. ;                     [x]   = pin nr. x
  206. ;
  207. ;
  208. ;                     vvvv  = resistor
  209. ;
  210. ;               |     |
  211. ;          |----|-----|--|
  212. ;          |    |   <-L  |  =  the powermodul
  213. ;          |  TRIAC <-E  |
  214. ;          |    |   <-D  |
  215. ;          |----|-----|--|
  216. ;               |     |
  217. ;
  218. ;
  219. ;                       |
  220. ;                        /  = key
  221. ;                       /
  222. ;                       |
  223. ;
  224. ;                      \ /
  225. ;                       X   = bulb  (only Ohmic resistance !)
  226. ;                      / \
  227. ;
  228. ; R1 = R2 = 4M7
  229. ; R3 = 470R
  230. ; R4 = 10K
  231. ;
  232. ;Klaus
  233.  
  234.  
  235.